package com.roads.workflow.service;

import java.util.List;

import com.roads.common.core.domain.AjaxResult;
import com.roads.common.core.domain.entity.SysDept;
import com.roads.common.core.domain.entity.SysUser;
import com.roads.workflow.domain.WorkflowMeterageDefinition;
import com.roads.workflow.domain.WorkflowMeterageNode;
import com.roads.workflow.domain.WorkflowMeterageNodeUser;
import com.roads.workflow.domain.WorkflowTask;
import com.roads.workflow.domain.WorkflowTaskDelivery;
import com.roads.workflow.domain.WorkflowTaskNode;
import com.roads.workflow.domain.WorkflowTaskStep;

/**
 * 工作流任务Service接口
 * 
 * @author nhp
 * @date 2022-01-09
 */
public interface IWorkflowTaskService {

    /**
     * 根据任务uuid获取任务信息
     *
     * @param taskUuid 任务uuid
     * @return 任务
     */
    WorkflowTask getWorkflowTask(String taskUuid);

    /**
     * 根据任务uuid获取流程节点，排除当前位置节点
     *
     * @param taskUuid 任务uuid
     * @return 流程节点
     */
    List<WorkflowMeterageNode> selectListWorkflowNodeByTaskUuid(String taskUuid);

    /**
     * 根据任务uuid，流程节点uuid，获取流程用户
     * 如果流程节点在流程任务里出现过，直接取流程任务节点，没有出现过，从流程节点里获取
     *
     * @param taskUuid 任务uuid
     * @param workflowNodeUuid 流程节点uuid
     * @return 流程节点用户
     */
    List<SysUser> getWorkflowNodeUser(String taskUuid, String workflowNodeUuid);

    /**
     * 创建工作流任务
     *
     * @param taskUuid 任务uuid
     * @param menuType 菜单类型
     * @param workflowType 流程类型
     * @param loginUser 当前登录用户
     * @param workflowNode 流程节点实例
     */
    void createTask(String taskUuid, String workflowType, Integer menuType, SysUser loginUser, WorkflowMeterageNode workflowNode);

    /**
     * 删除工作流任务
     *
     * @param taskUuid 任务uuid
     */
    void deleteTask(String taskUuid);

    /**
     * 完成工作流任务
     *
     * @param taskUuid 任务uuid
     * @param loginUser 当前登录用户
     */
    void finishTask(String taskUuid, SysUser loginUser);

    /**
     * 删除完成工作流任务
     * 解锁操作，需要删除完成步骤，还原任务状态为未完成
     *
     * @param taskUuid 任务uuid
     */
    void deleteFinishTask(String taskUuid);

    /**
     * 传送工作流任务
     *
     * @param delivery 传送实体
     * @param loginUser 当前登录用户
     * @param deliveryUser 传送至用户
     */
    void deliveryTask(WorkflowTaskDelivery delivery, SysUser loginUser, SysUser deliveryUser);

    /**
     * 获取用户节点列表
     *
     * @param taskUuid 任务uuid
     * @return 用户列表
     */
    List<WorkflowTaskNode> selectUserOptions(String taskUuid);

    /**
     * 查询流程步骤
     *
     * @param taskUuid 任务uuid
     * @return 任务步骤
     */
    List<WorkflowTaskStep> getWorkflowStep(String taskUuid);

}
